//
//  main.swift
//  LearnSwiftAPI
//
//  Created by Qin on 2024/10/12.
//

import Foundation
import CryptoKit

func learnRandom() {
    var randomInt = Int(arc4random_uniform(10)) + 1 // 生成一个介于1到10之间的随机整数
    print("随机整数：", randomInt)
    var randomRangeInt = Int(arc4random_uniform(101)) + 100 // 生成一个介于100到200之间的随机整数
    print("随机范围内的整数：", randomRangeInt)
    randomInt = Int.random(in: 1...10)
    print("随机整数：", randomInt)
    var randomFloat = Double.random(in: 0.0...1.0)
    print("随机浮点数：", randomFloat)
}

func learnXMLParser() {
    /**
     使用XMLParser解析XML文档
     1. 创建XMLParser代理类：首先，我们需要创建一个类来实现XMLParserDelegate协议。这个代理类将处理XML解析过程中触发的事件。
     2. 设置XMLParser：然后，我们需要创建一个XMLParser实例，并设置其代理。
     3. 开始解析：最后，调用parse()方法开始解析XML文档。
     */
    // XMLParser代理类
    class MyXMLParserDelegate: NSObject, XMLParserDelegate {
        private var currentElement = ""
        private var currentText: String? = ""
        private var items = [Item]()
        
        // 当解析器开始解析一个元素时被调用
        func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
            currentElement = elementName
            if elementName == "item" {
                let id = attributeDict["id"]
                currentText = id ?? ""
            }
        }
        // 当解析器找到字符数据时被调用
        func parser(_ parser: XMLParser, foundCharacters string: String) {
            currentText! += string.trimmingCharacters(in: .whitespacesAndNewlines)
        }
        
        // 当解析器结束解析一个元素时被调用
        func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
            switch elementName {
            case "name":
                guard let name = currentText else {
                    return
                }
                currentText = ""
            case "price":
                guard let price = Int(currentText!) else { return }
                currentText = ""
            case "item":
                guard let id = currentText, let name = items.last?.name, let price = items.last?.price else { return }
                let newItem = Item(id: id, name: name, price: price)
                items.append(newItem)
                currentText = ""
            default:
                break
            }
        }
        
        // 当解析器完成解析时被调用
        func parserDidEndDocument(_ parser: XMLParser) {
            print("解析完成，共找到\(items.count)个item：")
            items.forEach { item in
                print("\(item)")
            }
        }
    }

    func parseXML() {
        let fileURL = URL(fileURLWithPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/test.xml")
        
        /**
         读取文件
         */
        do {
            let xmlString = try String(contentsOf: fileURL, encoding: .utf8)
            print(xmlString)
            let xmlData = xmlString.data(using: .utf8)!
            let parser = XMLParser(data: xmlData)
            let delegate = MyXMLParserDelegate()
            parser.delegate = delegate
            parser.parse()
        } catch {
            print("Error reading the file: \(error)")
        }
    }

    parseXML()

    // Item模型
    struct Item {
        let id: String
        let name: String
        let price: Int
        
        var description: String {
            return "ID: \(id), Name: \(name), Price: \(price)"
        }
    }
}

func learnDate() {
    let now = Date()
    print(now)
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let dateString = dateFormatter.string(from: now)
    print(dateString) // 输出当前时间的字符串表示
    let dateFromString = dateFormatter.date(from: "2024-10-12 14:29:00")
    print(dateFromString ?? Date()) // 输出从字符串解析出的日期
    /**
     时间戳
     */
    let timestamp = now.timeIntervalSince1970
    print(timestamp)
    /**
     日期组件
     */
    let calendar = Calendar.current
    let components: DateComponents = calendar.dateComponents([.year, .month, .day], from: now)
    print(components.year ?? 0, components.month ?? 0, components.day ?? 0)
    /**
     日期计算
     */
    let oneDay = calendar.date(byAdding: .day, value: 1, to: now)
    print(oneDay ?? Date()) // 输出明天的日期
    /**
     日期区间
     */
    let interval = calendar.dateComponents([.day], from: now, to: oneDay!)
    print(interval.day ?? 0) // 输出间隔天数

    // TODO: 使用SwiftDate库
}

func learnFile() {
    // 在 Swift 中，URL 是处理文件路径的主要方式。它可以代表本地文件系统中的位置，也可以是网络资源的位置。
    let fileURL = URL(fileURLWithPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/test.txt")
    
    /**
     读取文件
     */
    do {
        let content = try String(contentsOf: fileURL, encoding: .utf8)
        print(content)
    } catch {
        print("Error reading the file: \(error)")
    }

    /**
     写入到文件
     */
    let textToWrite = "Nice to meet you!"
    do {
        try textToWrite.write(to: fileURL, atomically: true, encoding: .utf8) // 覆盖方式的写入
    } catch {
        print("Error writing to the file: \(error)")
    }

    /**
     追加方式写入到文件
     */
    do {
        let fileHandle = try FileHandle(forWritingTo: fileURL)
        let dataToAppend = "追加的文本\n".data(using: .utf8)
        // 将数据写入文件末尾
        fileHandle.seekToEndOfFile()
        fileHandle.write(dataToAppend!)
        // 关闭文件句柄
        fileHandle.closeFile()
        print("成功追加数据到文件！")
    } catch {
        print("Error append to the file: \(error)")
    }

    /**
     创建目录
     */
    /*let directoryURL = URL(fileURLWithPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/data")
    do {
        try FileManager.default.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print("Failed to create directory: \(error)")
    }*/

    /**
     删除文件
     */
    /*do {
        try FileManager.default.removeItem(at: fileURL)
    } catch {
        print("Failed to delete the file: \(error)")
    }*/

    /**
     复制文件
     */
    /*let destionationURL = URL(fileURLWithPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/copy.txt")
    do {
        try FileManager.default.copyItem(at: fileURL, to: destionationURL)
    } catch {
        print("Failed to copy the file: \(error)")
    }*/
    
    /**
     获取文件属性
     */
    do {
        let fileAttrs: [FileAttributeKey: Any] = try FileManager.default.attributesOfItem(atPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/test.txt")
        // 输出文件的创建日期
        if let creationDate = fileAttrs[.creationDate] as? Date {
            print("文件创建日期：\(creationDate)")
        }
        // 输出文件的修改日期
        if let modificationDate = fileAttrs[.modificationDate] as? Date {
            print("文件修改日期：\(modificationDate)")
        }
        // 输出文件大小
        if let fileSize = fileAttrs[.size] as? NSNumber {
            print("文件大小：\(fileSize) 字节")
        }
        if let filePermissions = fileAttrs[.posixPermissions] as? NSNumber {
            print("文件权限：\(filePermissions)")
        }
    } catch {
        print("无法获取文件属性：\(error)")
    }
    
    /**
     设置文件属性
     */
    let userRead = 0o400 // 用户读权限
    let userWrite = 0o200 // 用户写权限
    let userExecute = 0o100 // 用户执行权限
    let groupRead = 0o40 // 群组读权限
    let groupWrite = 0o20 // 群组写权限
    let groupExecute = 0o10 // 群组执行权限
    let otherRead = 0o4 // 其他人读权限
    let otherWrite = 0o2 // 其他人写权限
    let otherExecute = 0o1 // 其他人执行权限

    do {
        let permissions = userRead|userWrite
        let attributes = [FileAttributeKey.posixPermissions: NSNumber(value: permissions)]
        try FileManager.default.setAttributes(attributes, ofItemAtPath: "/Users/qin/Documents/workspaces/swift_workspace_one/LearnSwiftAPI/LearnSwiftAPI/test.txt")
        print("文件权限已成功设置为：\(String(permissions, radix: 8))")
    } catch {
        print("无法设置文件权限：\(error)")
    }
}







